package aerolineas;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.oceanic.AsientoDTO;

import despegar.utiles.Fecha;

import busquedas.CriteriosBusqueda;
import asientos.Asiento;
import asientos.AsientoOceanic;
import asientos.ClaseDeAsiento;
import asientos.ClaseDeAsientoEjecutiva;
import asientos.ClaseDeAsientoIncorrectaException;
import asientos.ClaseDeAsientoPrimera;
import asientos.ClaseDeAsientoTurista;
import asientos.UbicacionesAsiento;
import asientos.UbicacionDeAsientoInexistenteException;

public class OceanicAdapter implements Aerolinea {
	private OceanicWrapper aerolinea;
	private static BigDecimal PORCENTAJE_IMPUESTOS = new BigDecimal(0.1);
	
	public OceanicAdapter() {
		this.aerolinea = OceanicWrapper.getInstance();
	}
	
	@Override
	public List<Asiento> asientosDisponibles(CriteriosBusqueda criterios) {
		List<Asiento> asientos = new ArrayList<Asiento>();
		
		List<AsientoDTO> asientosOceanic;
		if(!criterios.getConEscalas()) {
			asientosOceanic = this.aerolinea.asientosDisponiblesParaOrigenYDestino(
					this.getCodigo(criterios.getOrigen()),
					this.getCodigo(criterios.getDestino()),
					criterios.getFechaSalida().asString("oceanic"));
		}
		else {
			asientosOceanic = this.aerolinea.asientosDisponiblesParaOrigen(
					this.getCodigo(criterios.getOrigen()),
					criterios.getFechaSalida().asString("oceanic"));
		}
		
		for(AsientoDTO unAsiento : asientosOceanic) {
			/* Getters del asientoDTO devuelto por AerolineaOceanic:
			getReservado():Boolean
			*/
			asientos.add(new AsientoOceanic(
				this.aerolinea,
				unAsiento.getCodigoDeVuelo(),
				unAsiento.getPrecio().multiply(PORCENTAJE_IMPUESTOS).setScale(2,BigDecimal.ROUND_UP),
				this.createUbicacion(unAsiento.getUbicacion()),
				this.getClase(unAsiento.getClase()),
				unAsiento.getOrigen(),
				unAsiento.getDestino(),
				new Fecha(unAsiento.getFechaDeSalida()),
				new Fecha(unAsiento.getFechaDeLlegada()),
				unAsiento.getHoraDeSalida(),
				unAsiento.getHoraDeLlegada(),
				unAsiento.getNumeroDeAsiento(),
				unAsiento.getReservado()));
		}
		return asientos;
	}
	
	private UbicacionesAsiento createUbicacion(String ubicacion) {
		if(ubicacion.equals("Pasillo")) {
			return UbicacionesAsiento.PASILLO;
		}
		else if(ubicacion.equals("Centro")) {
			return UbicacionesAsiento.CENTRO;
		}
		else if(ubicacion.equals("Ventana")) {
			return UbicacionesAsiento.VENTANA;
		}
		throw new UbicacionDeAsientoInexistenteException(ubicacion);
	}

	private ClaseDeAsiento getClase(String clase) {
		if (clase.equals("Turista")) {
			return new ClaseDeAsientoTurista();
		}
		else if (clase.equals("Ejecutiva")) {
			return new ClaseDeAsientoEjecutiva();
		}
		else if (clase.equals("Primera")) {
			return new ClaseDeAsientoPrimera();
		}
		else {
			throw new ClaseDeAsientoIncorrectaException();			
		}
	}

	private String getCodigo(String lugar) {
		if(lugar.equals("LA")) {
			return "SLA";
		}
		if(lugar.length() == 2) {
			return "_" + lugar;
		}
		return lugar;
	}

	@Override
	public String getNombre() {
		return NombresAerolineas.OCEANIC;
	}
}
